import { RequestConfig } from '@@/plugin-request/request';
import { getRequestConfig } from '@/system/config/RequestConfig';
import { getLayoutConfig } from '@/system/config/LayoutConfig';
import { MenuDataItem } from '@ant-design/pro-layout';
import Root from '@/system/page/Root';
import { getResource, getSetting, isLogin, mergeRoure } from '@/system/service/SystemService';
import React from 'react';

// 定义路由信息
let route: Array<MenuDataItem> = [];
let setting: any = {};
let loginStatus: boolean = false;

/**
 * 请求统一配置
 */
export const request: RequestConfig = {
  ...getRequestConfig(),
};
/**
 * layout布局配置
 */
export const layout = () => {
  return getLayoutConfig(setting, loginStatus, route);
};

/**
 * 动态路由配置
 * 使用了这个就没有约定路由了所以这个不建议用
 * @param routes 路由配置
 */
export const patchRoutes = ({ routes }: any) => {
  mergeRoure(routes, route);
};

/**
 * 渲染 优先所有运行
 * @param oldRender 渲染的方法
 */
export function render(oldRender: any) {
  // 检测有没有登录
  isLogin().then(isLoginBoolean => {
    if (isLoginBoolean) {
      // 是登录状态，获取菜单和数据后渲染
      Promise.all([getSetting(), getResource()]).then(values => {
        // 配置属性
        setting = values[0];
        // 路由菜单属性
        route = values[1];
        // 登录成功标识
        loginStatus = true;
        // 渲染页面
        oldRender();
      }).catch(error => {
        console.debug(error);
        // 跳转到异常页面

        oldRender();
      })
    } else {
      // 将首页改变成登录的
      oldRender();
    }
  }).catch(error => {
    console.debug(error)
    oldRender();
  })
}

/**
 * 初始化数据
 */
export async function getInitialState() {
  // 保存初始数据
  return new Promise(resolve => {
    // 保存到userModel
    resolve({
      isLogin: loginStatus,
      setting: setting,
      routes: route
    })
  });
}

/**
 * 全局配置（根节点）
 */
export function rootContainer(children:JSX.Element) {
  return <Root children={children} isLogin={loginStatus} setting={setting}/>;
}
